home *** CD-ROM | disk | FTP | other *** search
/ MacWorld 1998 January / Macworld (1998-01).dmg / Shareware World / Comms & Internet / HTML mode 2.0 etc. / html32.tcl < prev    next >
Text File  |  1997-09-22  |  12KB  |  296 lines

  1. ## -*-Tcl-*-
  2.  # ###################################################################
  3.  #  HTML mode - tools for editing HTML documents
  4.  # 
  5.  #  FILE: "html32.tcl"
  6.  #                                    created: 97-01-25 23.46.46 
  7.  #                                last update: 97-09-21 17.44.20 
  8.  #  Author: Johan Linde
  9.  #  E-mail: <jl@theophys.kth.se>
  10.  #     www: <http://bach.theophys.kth.se/~jl/Alpha.html>
  11.  #  
  12.  # Version: 2.0
  13.  # 
  14.  # Copyright 1996, 1997 by Johan Linde
  15.  #  
  16.  # This software may be used freely, and distributed freely, as long as the 
  17.  # receiver is not obligated in any way by receiving it.
  18.  #  
  19.  # If you make improvements to this file, please share them!
  20.  # 
  21.  # ###################################################################
  22.  ##
  23.  
  24. proc html32.tcl {} {}
  25.  
  26. #
  27. # htmlElemAttrRequired: the per-element lists of all required attributes
  28. # htmlElemAttrOptional: the per-element lists of all optional attributes
  29. # htmlElemAttrChoices: element-specific attribute completions
  30. # htmlElemAttrNumber: the per-element list of attributes which are numbers.
  31. # htmlElemEventHandler: the per-element list of JavaScript's event handlers.
  32. # htmlElemAttrUsed: the per-element list of elements asked for in the status bar.
  33. #
  34. # htmlElemAttrOptional has to be defined for every element for everything
  35. # to work.
  36.  
  37. set htmlElemAttrOptional3(HTML) {}
  38. set htmlElemAttrOptional3(HEAD) {}
  39. set htmlElemAttrOptional3(TITLE) {}
  40. set htmlElemAttrOptional3(BODY)    {BACKGROUND= BGCOLOR= TEXT= LINK= VLINK= ALINK=}
  41. htmlSetAttrUsed 3 BODY {BACKGROUND= BGCOLOR= TEXT= LINK= VLINK=}
  42.  
  43. set htmlElemAttrOptional3(STYLE) {TYPE=}
  44. set htmlElemAttrOptional3(SPAN) {}
  45. htmlSetAttrUsed 3 SPAN {CLASS= ID= STYLE=}
  46.  
  47. set htmlElemAttrOptional3(H1)    {ALIGN= }
  48. set htmlElemAttrChoices3(H1)    {ALIGN=CENTER ALIGN=RIGHT ALIGN=LEFT}
  49. htmlSetAttrUsed 3 H1    {ALIGN=}
  50. set htmlElemAttrOptional3(H2)    {ALIGN= }
  51. set htmlElemAttrChoices3(H2)    {ALIGN=CENTER ALIGN=RIGHT ALIGN=LEFT}
  52. htmlSetAttrUsed 3 H2    {ALIGN=}
  53. set htmlElemAttrOptional3(H3)    {ALIGN= }
  54. set htmlElemAttrChoices3(H3)    {ALIGN=CENTER ALIGN=RIGHT ALIGN=LEFT}
  55. htmlSetAttrUsed 3 H3    {ALIGN=}
  56. set htmlElemAttrOptional3(H4)    {ALIGN= }
  57. set htmlElemAttrChoices3(H4)    {ALIGN=CENTER ALIGN=RIGHT ALIGN=LEFT}
  58. htmlSetAttrUsed 3 H4    {ALIGN=}
  59. set htmlElemAttrOptional3(H5)    {ALIGN= }
  60. set htmlElemAttrChoices3(H5)    {ALIGN=CENTER ALIGN=RIGHT ALIGN=LEFT}
  61. htmlSetAttrUsed 3 H5    {ALIGN=}
  62. set htmlElemAttrOptional3(H6)    {ALIGN= }
  63. set htmlElemAttrChoices3(H6)    {ALIGN=CENTER ALIGN=RIGHT ALIGN=LEFT}
  64. htmlSetAttrUsed 3 H6    {ALIGN=}
  65.  
  66. set htmlElemAttrOptional3(P)    {ALIGN= }
  67. set htmlElemAttrChoices3(P)    {ALIGN=CENTER ALIGN=RIGHT ALIGN=LEFT}
  68. htmlSetAttrUsed 3 P    {ALIGN=}
  69. set htmlElemAttrOptional3(BLOCKQUOTE) {}
  70. set htmlElemAttrOptional3(DIV)    {ALIGN= }
  71. set htmlElemAttrChoices3(DIV)    {ALIGN=CENTER ALIGN=RIGHT ALIGN=LEFT}
  72. htmlSetAttrUsed 3 DIV    {ALIGN=}
  73. set htmlElemAttrOptional3(ADDRESS) {}
  74. set htmlElemAttrOptional3(CENTER) {}
  75. set htmlElemAttrOptional3(PRE)    {WIDTH= }
  76. set htmlElemAttrNumber3(PRE)    {WIDTH=1:i:n}
  77. set htmlElemAttrOptional3(BR)    {CLEAR= }
  78. set htmlElemAttrChoices3(BR)    {CLEAR=ALL CLEAR=LEFT CLEAR=RIGHT CLEAR=NONE}
  79. set htmlElemAttrOptional3(HR)    {ALIGN= SIZE= WIDTH= NOSHADE}
  80. set htmlElemAttrChoices3(HR)    {ALIGN=LEFT ALIGN=RIGHT ALIGN=CENTER}
  81. set htmlElemAttrNumber3(HR)     {SIZE=1:i:n WIDTH=1:i:%}
  82.  
  83. set htmlElemAttrOptional3(FONT)    {SIZE= COLOR=}
  84. set htmlElemAttrNumber3(FONT)    {SIZE=1:7:n}
  85. htmlSetAttrUsed 3 FONT    {SIZE=}
  86. set htmlElemAttrRequired3(BASEFONT)    {SIZE=}
  87. set htmlElemAttrOptional3(BASEFONT) {}
  88. set htmlElemAttrNumber3(BASEFONT)    {SIZE=1:7:n}
  89. set htmlElemAttrOptional3(B) {}
  90. set htmlElemAttrOptional3(I) {}
  91. set htmlElemAttrOptional3(STRIKE) {}
  92. set htmlElemAttrOptional3(U) {}
  93. set htmlElemAttrOptional3(SUB) {}
  94. set htmlElemAttrOptional3(SUP) {}
  95. set htmlElemAttrOptional3(BIG) {}
  96. set htmlElemAttrOptional3(SMALL) {}
  97. set htmlElemAttrOptional3(EM) {}
  98. set htmlElemAttrOptional3(STRONG) {}
  99. set htmlElemAttrOptional3(DFN)    {}
  100. set htmlElemAttrOptional3(CODE) {}
  101. set htmlElemAttrOptional3(VAR) {}
  102. set htmlElemAttrOptional3(CITE) {}
  103. set htmlElemAttrOptional3(KBD) {}
  104. set htmlElemAttrOptional3(TT) {}
  105. set htmlElemAttrOptional3(SAMP) {}
  106.  
  107. set htmlElemAttrOptional3(A)    {HREF= NAME= REL= REV=  TITLE= }
  108. htmlSetAttrUsed 3 A    {HREF= NAME=}
  109. set htmlElemAttrRequired3(IMG)    {SRC=}
  110. set htmlElemAttrOptional3(IMG)    {WIDTH= HEIGHT=  BORDER= 
  111. ALIGN= ALT= HSPACE= VSPACE= USEMAP= ISMAP}
  112. set htmlElemAttrChoices3(IMG)    {ALIGN=TOP ALIGN=MIDDLE ALIGN=BOTTOM 
  113. ALIGN=LEFT ALIGN=RIGHT}
  114. set htmlElemAttrNumber3(IMG) {BORDER=0:i:n WIDTH=1:i:n HEIGHT=1:i:n
  115. HSPACE=0:i:n VSPACE=0:i:n}
  116. htmlSetAttrUsed 3 IMG    {SRC= WIDTH= HEIGHT= ALIGN= ALT=}
  117.  
  118. set htmlElemAttrOptional3(UL)    {TYPE= COMPACT}
  119. set htmlElemAttrChoices3(UL)    {TYPE=DISC TYPE=CIRCLE TYPE=SQUARE}
  120. set htmlElemAttrOptional3([list LI IN UL])    {TYPE=}
  121. set htmlElemAttrChoices3([list LI IN UL])    {TYPE=DISC TYPE=CIRCLE TYPE=SQUARE}
  122. set htmlElemAttrOptional3(OL)    {TYPE= START= COMPACT}
  123. set htmlElemAttrChoices3(OL)    {TYPE=A TYPE=a TYPE=I TYPE=i TYPE=1}
  124. set htmlElemAttrNumber3(OL)    {START=1:i:n}
  125. set htmlElemAttrOptional3([list LI IN OL])    {TYPE= VALUE=}
  126. set htmlElemAttrNumber3([list LI IN OL])    {VALUE=1:i:n}
  127. set htmlElemAttrChoices3([list LI IN OL])    {TYPE=A TYPE=a TYPE=I TYPE=i TYPE=1}
  128. set htmlElemAttrOptional3(DIR) {COMPACT}
  129. set htmlElemAttrOptional3(MENU) {COMPACT}
  130. set htmlElemAttrOptional3(LI) {}
  131. set htmlElemAttrOptional3(DL) {COMPACT}
  132. set htmlElemAttrOptional3(DT) {}
  133. set htmlElemAttrOptional3(DD)    {}
  134.  
  135. set htmlElemAttrOptional3(FORM)    {ACTION= METHOD= ENCTYPE= }
  136. set htmlElemAttrChoices3(FORM)    {METHOD=POST METHOD=GET}
  137. htmlSetAttrUsed 3 FORM    {ACTION= METHOD= }
  138. set htmlElemAttrRequired3(TEXT)    {NAME=}
  139. set htmlElemAttrOptional3(TEXT)    {VALUE= SIZE= MAXLENGTH=}
  140. set htmlElemAttrNumber3(TEXT)    {SIZE=1:i:n MAXLENGTH=1:i:n}
  141. htmlSetAttrUsed 3 TEXT    {NAME= VALUE= SIZE= MAXLENGTH=}
  142. set htmlElemAttrRequired3(CHECKBOX)    {NAME= VALUE=}
  143. set htmlElemAttrOptional3(CHECKBOX)    {CHECKED}
  144. htmlSetAttrUsed 3 CHECKBOX    {NAME= VALUE= CHECKED}
  145. set htmlElemAttrRequired3(RADIO)    {NAME= VALUE=}
  146. set htmlElemAttrOptional3(RADIO)    {CHECKED}
  147. htmlSetAttrUsed 3 RADIO    {NAME= VALUE= CHECKED}
  148. set htmlElemAttrOptional3(SUBMIT)    {NAME= VALUE=}
  149. htmlSetAttrUsed 3 SUBMIT    {VALUE= }
  150. set htmlElemAttrOptional3(RESET)    {VALUE= }
  151. htmlSetAttrUsed 3 RESET    {VALUE= }
  152. set htmlElemAttrRequired3(PASSWORD)    {NAME= }
  153. set htmlElemAttrOptional3(PASSWORD)    {VALUE= SIZE= MAXLENGTH=}
  154. set htmlElemAttrNumber3(PASSWORD)    {SIZE=1:i:n MAXLENGTH=1:i:n}
  155. htmlSetAttrUsed 3 PASSWORD    {NAME= VALUE= SIZE= MAXLENGTH=}
  156. set htmlElemAttrRequired3(HIDDEN)    {NAME= VALUE=}
  157. set htmlElemAttrOptional3(HIDDEN)    {}
  158. set htmlElemAttrRequired3(IMAGE)    {NAME= SRC=}
  159. set htmlElemAttrOptional3(IMAGE)    {ALIGN=}
  160. set htmlElemAttrChoices3(IMAGE)    {ALIGN=TOP ALIGN=MIDDLE ALIGN=BOTTOM
  161. ALIGN=LEFT ALIGN=RIGHT}
  162. set htmlElemAttrRequired3(FILE)    {NAME= }
  163. set htmlElemAttrOptional3(FILE)    {SIZE= MAXLENGTH=}
  164. set htmlElemAttrNumber3(FILE)    {SIZE=1:i:n MAXLENGTH=1:i:n}
  165. set htmlElemAttrRequired3(SELECT)    {NAME= }
  166. set htmlElemAttrOptional3(SELECT)    {SIZE= MULTIPLE}
  167. set htmlElemAttrNumber3(SELECT)     {SIZE=1:i:n}
  168. htmlSetAttrUsed 3 SELECT    {NAME= SIZE= MULTIPLE}
  169. set htmlElemAttrOptional3(OPTION)    {VALUE= SELECTED}
  170. htmlSetAttrUsed 3 OPTION    {SELECTED}
  171. set htmlElemAttrRequired3(TEXTAREA)    {NAME= ROWS= COLS=}
  172. set htmlElemAttrOptional3(TEXTAREA)    {}
  173. set htmlElemAttrNumber3(TEXTAREA)    {ROWS=1:i:n COLS=1:i:n}
  174.  
  175. set htmlElemAttrOptional3(TABLE)    {BORDER= CELLSPACING= CELLPADDING= WIDTH= 
  176. ALIGN=}
  177. set htmlElemAttrChoices3(TABLE)    {ALIGN=LEFT ALIGN=CENTER ALIGN=RIGHT}
  178. set htmlElemAttrNumber3(TABLE)    {BORDER=0:i:n CELLSPACING=0:i:n 
  179. CELLPADDING=0:i:n WIDTH=1:i:%}
  180. htmlSetAttrUsed 3 TABLE    {BORDER= CELLSPACING= CELLPADDING=}
  181. set htmlElemAttrOptional3(TD)    {ALIGN= VALIGN= COLSPAN= ROWSPAN= WIDTH= HEIGHT= NOWRAP}
  182. set htmlElemAttrChoices3(TD)    {ALIGN=CENTER ALIGN=RIGHT ALIGN=LEFT 
  183. VALIGN=BOTTOM VALIGN=MIDDLE VALIGN=TOP }
  184. set htmlElemAttrNumber3(TD)    {COLSPAN=1:i:n ROWSPAN=1:i:n WIDTH=1:i:n HEIGHT=1:i:n}
  185. htmlSetAttrUsed 3 TD    {ALIGN= VALIGN= COLSPAN= ROWSPAN= NOWRAP}
  186. set htmlElemAttrOptional3(TH)    {ALIGN= VALIGN= COLSPAN= ROWSPAN= WIDTH= HEIGHT= NOWRAP}
  187. set htmlElemAttrChoices3(TH)    {ALIGN=LEFT ALIGN=CENTER ALIGN=RIGHT 
  188. VALIGN=BOTTOM VALIGN=MIDDLE VALIGN=TOP }
  189. set htmlElemAttrNumber3(TH)    {COLSPAN=1:i:n ROWSPAN=1:i:n WIDTH=1:i:n HEIGHT=1:i:n}
  190. htmlSetAttrUsed 3 TH    {ALIGN= VALIGN= COLSPAN= ROWSPAN= NOWRAP }
  191. set htmlElemAttrOptional3(TR)    {ALIGN= VALIGN= }
  192. set htmlElemAttrChoices3(TR)    {ALIGN=CENTER ALIGN=RIGHT ALIGN=LEFT  
  193. VALIGN=BOTTOM VALIGN=MIDDLE VALIGN=TOP }
  194. htmlSetAttrUsed 3 TR    {ALIGN= VALIGN=}
  195. set htmlElemAttrOptional3(CAPTION)    {ALIGN=}
  196. set htmlElemAttrChoices3(CAPTION)    {ALIGN=BOTTOM ALIGN=TOP }
  197. htmlSetAttrUsed 3 CAPTION    {ALIGN=}    
  198.  
  199. set htmlElemAttrRequired3(MAP)        {NAME=}
  200. set htmlElemAttrOptional3(MAP)        {}
  201. set htmlElemAttrRequired3(AREA)    {COORDS= ALT=}
  202. set htmlElemAttrOptional3(AREA)    {SHAPE= HREF= NOHREF}
  203. set htmlElemAttrChoices3(AREA)    {SHAPE=RECT SHAPE=CIRCLE SHAPE=POLY}
  204. htmlSetAttrUsed 3 AREA    {SHAPE= COORDS= HREF= NOHREF}
  205.  
  206. set htmlElemAttrRequired3(APPLET)    {CODE= WIDTH= HEIGHT=}
  207. set htmlElemAttrOptional3(APPLET)     {CODEBASE= HSPACE= VSPACE= ALIGN= NAME= ALT=}
  208. set htmlElemAttrChoices3(APPLET)    {ALIGN=TOP ALIGN=MIDDLE ALIGN=BOTTOM 
  209. ALIGN=LEFT ALIGN=RIGHT}
  210. set htmlElemAttrNumber3(APPLET)     {VSPACE=0:i:n HSPACE=0:i:n WIDTH=1:i:n
  211. HEIGHT=1:i:n}
  212. htmlSetAttrUsed 3 APPLET    {CODE= WIDTH= HEIGHT= CODEBASE= ALIGN= }
  213. set htmlElemAttrRequired3(PARAM)    {NAME= VALUE=}
  214. set htmlElemAttrOptional3(PARAM)    {}
  215.  
  216. set htmlElemAttrRequired3(BASE)    {HREF= }
  217. set htmlElemAttrOptional3(BASE)    {}
  218. set htmlElemAttrOptional3(ISINDEX)    {PROMPT=}
  219. set htmlElemAttrOptional3(LINK)    {HREF=  REL= REV= TITLE= TYPE=}
  220. htmlSetAttrUsed 3 LINK    {HREF=}
  221. set htmlElemAttrRequired3(META)    {CONTENT=}
  222. set htmlElemAttrOptional3(META)    {NAME= HTTP-EQUIV=}
  223.  
  224. # Add style sheet attrs, CLASS, ID, STYLE.
  225. set tmpNoStyle {BASE BASEFONT HEAD HTML META PARAM STYLE TITLE}
  226. foreach tmp [array names htmlElemAttrOptional3] {
  227.     if {[lsearch -exact $tmpNoStyle $tmp] < 0} {
  228.         lappend htmlElemAttrOptional3($tmp) CLASS= ID= STYLE=
  229.     }
  230. }
  231.  
  232. unset tmp tmpNoStyle
  233.  
  234. proc htmlCheckConfig3 {} {
  235.     
  236.     upvar mayContain mayContain empty empty closingOptional closingOptional form form
  237.     
  238.     set headmisc {SCRIPT STYLE META LINK}
  239.     set headContent {TITLE ISINDEX BASE}
  240.     set heading {H1 H2 H3 H4 H5 H6}
  241.     set lists {UL OL DIR MENU}
  242.     set preformatted {PRE}
  243.     set font {TT I B U STRIKE BIG SMALL SUB SUP}
  244.     set phrase {EM STRONG DFN CODE SAMP KBD VAR CITE}
  245.     set special {A IMG APPLET FONT BASEFONT BR SCRIPT MAP}
  246.     set form {INPUT SELECT TEXTAREA}
  247.     set text [concat text $font $phrase $special $form]
  248.     set block [concat P $lists $preformatted DL DIV CENTER BLOCKQUOTE FORM ISINDEX HR TABLE]
  249.     set flow [concat $text $block]
  250.     set bodyContent [concat $heading $text $block ADDRESS]
  251.     
  252.     # Empty elements
  253.     set empty {BASEFONT BR AREA LINK IMG PARAM HR INPUT ISINDEX BASE META}
  254.     
  255.     # Define what each element mayContain contain
  256.     foreach i [concat $font $phrase FONT A P $heading PRE DT CAPTION] {
  257.         set mayContain($i) $text
  258.     }
  259.     set mayContain(A) [lreplace $mayContain(A) [set where [lsearch -exact $mayContain(A) A]] $where]
  260.     
  261.     set preExclusion {IMG BIG SMALL SUB SUP FONT}
  262.     foreach i $preExclusion {
  263.         set where [lsearch -exact $mayContain(PRE) $i]
  264.         set mayContain(PRE) [lreplace $mayContain(PRE) $where $where]
  265.     }
  266.     
  267.     foreach i {BODY DIV CENTER BLOCKQUOTE FORM TH TD} {
  268.         set mayContain($i) $bodyContent
  269.     }
  270.     set mayContain(FORM) [lreplace $mayContain(FORM) [set where [lsearch -exact $mayContain(FORM) FORM]] $where]
  271.     set mayContain(ADDRESS) [concat $text P]
  272.     set mayContain(MAP) AREA
  273.     set mayContain(APPLET) [concat $text PARAM]
  274.     set mayContain(DL) {DT DD}
  275.     set mayContain(DD) $flow
  276.     set mayContain(LI) $flow
  277.     foreach i $lists {
  278.         set mayContain($i) LI
  279.     }
  280.     set mayContain(SELECT) OPTION
  281.     set mayContain(OPTION) text
  282.     set mayContain(TEXTAREA) text
  283.     set mayContain(TABLE) {CAPTION TR}
  284.     set mayContain(TR) {TD TH}
  285.     set mayContain(HEAD) [concat $headContent $headmisc]
  286.     set mayContain(SCRIPT) text
  287.     set mayContain(STYLE) text
  288.     set mayContain(TITLE) text
  289.     set mayContain(HTML) {HEAD BODY}
  290.     # Dummy tag to start with.
  291.     set mayContain(WINDOW) HTML
  292.     
  293.     # These have an optional closing tag.
  294.     set closingOptional {P DT DD LI OPTION TR TD TH HEAD BODY HTML WINDOW}
  295. }
  296.